package statemachine;

import java.util.Map;
import java.util.Set;

/**
 * Abstrakte Klasse, die Methoden zur Implementierung der beiden OSPF Zustandsautomaten bietet.
 * @author pascal
 *
 */
public abstract class AbstractStateMachine {
	/**
	 * Startzustand
	 */
	private StateInterface initState;
	/**
	 * Menge aller Zustände
	 */
	private Set<StateInterface> setOfStates;
	/**
	 * Menge alle Endzustände. 
	 */
	private Set<StateInterface> finalStates;
	/**
	 * Alphabet des Automaten.
	 */
	private Map<String, String> alphabet;
	

	/**
	 * Methode um dem Automaten Transitionen hinzuzufügen.
	 * @param state
	 * @param input
	 * @param nextState
	 */
	protected boolean addTransition(StateInterface state, String input, StateInterface nextState){
		if(setOfStates.contains(state) && alphabet.containsKey(input) && setOfStates.contains(nextState)){
			state.addTransition(input, nextState);
			return true;
		}
		return false;
	}
	
	/**
	 * Fügt dem Automaten einen neuen Zustand hinzu.
	 * @param stateName
	 */
	protected void addState(StateInterface state){
		this.setOfStates.add(state);
	}
	
	
	
	/**
	 * Fügt ein Wort dem Alphabet hinzu.
	 * @param word
	 * @param explanation
	 */
	protected void addWordToAlphabet(String word, String explanation){
		alphabet.put(word, explanation);
	}
	
	/**
	 * Gibt den Folgezustand des aktuellen Zustandes bei Eingabe eines Wortes aus.
	 * @param state
	 * @param input
	 * @return
	 */
	public StateInterface transit(StateInterface state, String input){
		if(setOfStates.contains(state) && (alphabet.containsKey(input)))
		{
			return state.getNextStatesMap().get(input);
		}
		else return null;		
	}
	
	public StateInterface getStateByName(String name){
		for (StateInterface st : setOfStates) {
			if(st.getName() == name){
				return st;
			}
		}
		return null;
	}
	
	/**
	 * Fügt einen Zustand der Menge aller Endzustände hinzu.
	 * @param state
	 */
	public void addToFinalStates(State state){
		if(setOfStates.contains(state)){
			finalStates.add(state);
		}
		else System.out.println("Der Zustand muss zuerst in die Menge aller Zustände übernommen werden");
	}
	
	

}
